// pages/login/login.js
// 引入数据库辅助工具
const dbHelper = require('../../utils/dbHelper.js');

Page({
  // 页面数据，存储用户信息和登录状态
  data: {
    avatarUrl: '',
    username: '',
    role: 'student', // 默认为学生身份
    class: '',
    phone: '',
    dormitory: '',
    password: '',
    confirmPassword: '', // 确认密码
    // 登录相关状态控制
    loginType: 'account', // 默认为账号密码登录
    isNewUser: false, // 是否为新用户
    isRegistering: false // 是否正在注册
  },

  // 页面加载时执行的生命周期函数
  onLoad: function (options) {
    // 页面加载时检查是否已有用户信息
    const userInfo = wx.getStorageSync('userInfo');
    // 如果存在用户信息，自动填充表单
    if (userInfo) {
      this.setData({
        avatarUrl: userInfo.avatarUrl || '',
        username: userInfo.username || '',
        role: userInfo.role || 'student',
        class: userInfo.class || '',
        phone: userInfo.phone || '',
        dormitory: userInfo.dormitory || ''
      });
    }
    
    // 如果当前是微信登录模式，检查用户是否存在
    if (this.data.loginType === 'wechat') {
      this.checkUserExists();
    }
  },

  // 切换登录方式（账号密码/微信登录）
  switchLoginType(e) {
    const type = e.currentTarget.dataset.type;
    this.setData({
      loginType: type
    });
    
    // 如果切换到微信登录，检查用户是否存在
    if (type === 'wechat') {
      this.checkUserExists();
    }
  },

  // 获取用户头像，从微信选择头像API回调
  onChooseAvatar(e) {
    const { avatarUrl } = e.detail;
    this.setData({
      avatarUrl
    });
  },

  // 获取用户名输入
  onInputUsername(e) {
    this.setData({
      username: e.detail.value
    });
  },

  // 切换用户角色（学生/老师/工作人员）
  onRoleChange(e) {
    this.setData({
      role: e.detail.value
    });
  },

  // 获取班级信息输入
  onInputClass(e) {
    this.setData({
      class: e.detail.value
    });
  },

  // 获取电话号码输入
  onInputPhone(e) {
    this.setData({
      phone: e.detail.value
    });
  },

  // 获取宿舍号输入
  onInputDormitory(e) {
    this.setData({
      dormitory: e.detail.value
    });
  },

  // 获取密码输入
  onInputPassword(e) {
    this.setData({
      password: e.detail.value
    });
  },

  // 获取确认密码输入
  onInputConfirmPassword(e) {
    this.setData({
      confirmPassword: e.detail.value
    });
  },

  // 切换注册/登录状态
  switchRegisterLogin() {
    this.setData({
      isRegistering: !this.data.isRegistering
    });
  },

  // 注册新用户的功能实现
  async register() {
    // 验证输入完整性
    if (!this.data.username || !this.data.password || !this.data.confirmPassword || !this.data.phone) {
      wx.showToast({
        title: '请填写完整信息',
        icon: 'none'
      });
      return;
    }

    // 验证密码是否一致
    if (this.data.password !== this.data.confirmPassword) {
      wx.showToast({
        title: '两次输入的密码不一致',
        icon: 'none'
      });
      return;
    }

    try {
      // 显示加载提示
      wx.showLoading({
        title: '注册中...',
      });
      
      // 检查用户名是否已存在
      const existingUser = await dbHelper.getUserInfoByUsername(this.data.username);
      
      // 如果用户名已存在，提示错误
      if (existingUser) {
        wx.hideLoading();
        wx.showToast({
          title: '用户名已存在',
          icon: 'none'
        });
        return;
      }
      
      // 创建新用户数据对象
      const newUserData = {
        username: this.data.username,
        password: this.data.password,
        avatarUrl: this.data.avatarUrl || '/assets/default-avatar.png',
        gender: 0, // 默认未知
        role: this.data.role,
        phone: this.data.phone,
        dormitory: this.data.role === 'student' ? this.data.dormitory : '',
        remark: ''
      };
      
      // 根据用户角色处理班级字段
      if (this.data.role === 'teacher' || this.data.role === 'student') {
        newUserData.classes = this.data.class ? [this.data.class] : []; // 老师和学生有 classes 字段，初始只加一个
      }
      // staff 角色不需要 classes 字段
      
      // 调用数据库创建用户
      await dbHelper.createUser(newUserData);
      
      // 隐藏加载提示，显示成功提示
      wx.hideLoading();
      wx.showToast({
        title: '注册成功',
        icon: 'success'
      });
      
      // 注册成功后切换到登录状态
      this.setData({
        isRegistering: false
      });
      
    } catch (error) {
      // 错误处理
      wx.hideLoading();
      console.error('注册失败:', error);
      wx.showToast({
        title: '注册失败，请重试',
        icon: 'none'
      });
    }
  },

  // 账号密码登录功能实现
  async loginWithAccount() {
    // 验证用户名和密码是否填写
    if (!this.data.username || !this.data.password) {
      wx.showToast({
        title: '请输入用户名和密码',
        icon: 'none'
      });
      return;
    }

    try {
      // 显示加载提示
      wx.showLoading({
        title: '登录中...',
      });
      
      // 通过用户名和密码获取用户信息
      const userData = await dbHelper.getUserInfoByUsernameAndPassword(this.data.username, this.data.password);
      
      // 如果获取到用户数据，表示登录成功
      if (userData) {
        // 登录成功，保存用户信息到本地存储
        wx.setStorageSync('userInfo', userData);
        
        // 隐藏加载提示，显示成功提示
        wx.hideLoading();
        wx.showToast({
          title: '登录成功',
          icon: 'success'
        });
        
        // 返回上一页
        setTimeout(() => {
          wx.navigateBack();
        }, 1500);
      } else {
        // 用户名或密码错误
        wx.hideLoading();
        wx.showToast({
          title: '用户名或密码错误',
          icon: 'none'
        });
      }
    } catch (error) {
      // 错误处理
      wx.hideLoading();
      console.error('登录失败:', error);
      wx.showToast({
        title: '登录失败，请重试',
        icon: 'none'
      });
    }
  },

  // 微信登录功能实现
  async loginWithWechat() {
    // 验证信息完整性
    if (!this.data.avatarUrl || !this.data.username) {
      wx.showToast({
        title: '请填写完整信息',
        icon: 'none'
      });
      return;
    }

    // 如果是新用户且未设置用户名和密码
    if (this.data.isNewUser && (!this.data.username || !this.data.password)) {
      wx.showToast({
        title: '请设置用户名和密码',
        icon: 'none'
      });
      return;
    }

    // 开始登录流程，打印日志便于调试
    console.log('===== 登录过程开始 =====');
    console.log('用户输入的用户名:', this.data.username);
    console.log('用户选择的角色:', this.data.role);

    // 获取用户OpenID
    try {
      // 显示加载提示
      wx.showLoading({
        title: '登录中...',
      });
      
      // 调用云函数获取OpenID
      console.log('调用云函数获取OpenID');
      const openIdRes = await wx.cloud.callFunction({
        name: 'fetchopenid'
      });
      
      // 检查云函数返回结果
      console.log('云函数返回结果:', openIdRes);
      if (!openIdRes.result.success) {
        console.error('获取OpenID失败:', openIdRes.result.errMsg);
        throw new Error(openIdRes.result.errMsg || '获取用户OpenID失败');
      }
      
      // 获取OpenID
      const openid = openIdRes.result.openid;
      console.log('获取到的OpenID:', openid);
      
      // 验证OpenID是否有效
      if (!openid) {
        console.error('OpenID为空');
        throw new Error('获取用户OpenID失败');
      }

      // 查询用户是否已存在
      console.log('查询用户是否已存在');
      let userData = await dbHelper.getUserInfo(openid);
      
      console.log('数据库中的用户信息:', userData);
      
      // 用户已存在，更新信息
      if (userData) {
        console.log('用户已存在，更新信息');
        const updateData = {
          username: this.data.username,
          avatarUrl: this.data.avatarUrl,
          role: this.data.role,
          phone: this.data.phone,
          dormitory: this.data.role === 'student' ? this.data.dormitory : ''
        };
        console.log('更新用户数据 (原始):', updateData);
        
        // 根据角色处理班级字段
        if (this.data.role === 'teacher' || this.data.role === 'student') {
           updateData.classes = this.data.class ? [this.data.class] : (userData.classes || []); // 保留原有班级信息
           // 根据输入情况决定是否更新班级信息
           if(this.data.class && updateData.classes.indexOf(this.data.class) === -1) {
               updateData.classes = [this.data.class]; // 简单处理：登录界面输入总是覆盖
           } else if (!this.data.class && this.data.role === 'student') {
               // 学生允许清空班级
               updateData.classes = [];
           } else if (!this.data.class && this.data.role === 'teacher') {
               // 老师不允许在登录页清空班级列表
               delete updateData.classes; // 不更新 classes
           }
        }
        // staff 角色不需要更新 classes 字段
        console.log('更新用户数据 (加入classes后):', updateData);
        
        // 更新用户信息
        await dbHelper.updateUser(openid, updateData);
        console.log('用户信息更新成功');
      } else {
        // 用户不存在，创建新用户
        console.log('用户不存在，创建新用户');
        const newUserData = {
          openid: openid,
          username: this.data.username,
          password: this.data.password, // 新用户需要设置密码
          avatarUrl: this.data.avatarUrl,
          gender: 0, // 默认未知
          role: this.data.role,
          phone: this.data.phone, // 电话
          dormitory: this.data.role === 'student' ? this.data.dormitory : '', // 宿舍号
          remark: ''
        };
        
        // 根据角色处理 classes 字段
        if (this.data.role === 'teacher' || this.data.role === 'student') {
          newUserData.classes = this.data.class ? [this.data.class] : []; // 老师和学生有 classes 字段
        }
        // staff 角色不需要 classes 字段
        
        console.log('创建的新用户数据:', newUserData);
        
        // 创建新用户
        await dbHelper.createUser(newUserData);
        console.log('新用户创建成功');
      }

      // 获取最新用户数据并保存到本地
      console.log('重新获取用户数据');
      userData = await dbHelper.getUserInfo(openid);
      console.log('获取到的最新用户数据:', userData);
      
      // 保存到本地存储
      console.log('保存用户信息到本地存储');
      wx.setStorageSync('userInfo', userData);
      
      // 验证保存的数据是否正确
      const savedUserInfo = wx.getStorageSync('userInfo');
      console.log('从本地存储读取的用户信息:', savedUserInfo);
      console.log('角色是否正确:', savedUserInfo.role === this.data.role);
      console.log('OpenID是否存在:', Boolean(savedUserInfo.openid || savedUserInfo._openid));
      
      // 登录成功，隐藏加载提示，显示成功提示
      wx.hideLoading();
      wx.showToast({
        title: '登录成功',
        icon: 'success'
      });
      
      console.log('===== 登录过程完成 =====');
      
      // 返回上一页
      setTimeout(() => {
        wx.navigateBack();
      }, 1500);
      
    } catch (error) {
      // 错误处理
      wx.hideLoading();
      console.error('登录失败:', error);
      console.error('错误详情:', error.message);
      console.error('错误堆栈:', error.stack);
      wx.showToast({
        title: '登录失败，请重试',
        icon: 'none'
      });
    }
  },

  // 检查微信用户是否存在于数据库
  async checkUserExists() {
    try {
      // 调用云函数获取OpenID
      const openIdRes = await wx.cloud.callFunction({
        name: 'fetchopenid'
      });
      
      // 检查云函数调用结果
      if (!openIdRes.result.success) {
        return false;
      }
      
      // 获取OpenID
      const openid = openIdRes.result.openid;
      if (!openid) {
        return false;
      }
      
      // 通过OpenID查询用户信息
      const userData = await dbHelper.getUserInfo(openid);
      
      // 如果用户存在，自动填充表单
      if (userData) {
        // 用户存在，自动填充已知信息
        this.setData({
          isNewUser: false,
          avatarUrl: userData.avatarUrl || '',
          username: userData.username || '',
          role: userData.role || 'student',
          class: userData.class || '',
          phone: userData.phone || '',
          dormitory: userData.dormitory || ''
        });
        return true;
      } else {
        // 用户不存在，标记为新用户
        this.setData({
          isNewUser: true
        });
        return false;
      }
    } catch (error) {
      // 错误处理
      console.error('检查用户是否存在失败:', error);
      return false;
    }
  }
}); 